<?php if (!defined('DEDEINC')) {
    exit("DedeCMS Error: Request Error!");
}

/**
 * 视图类
 *
 * @version   $Id: arc.partview.class.php 1 14:17 2010年7月7日 $
 * @package   DedeCMS.Libraries
 * @founder   IT柏拉图, https://weibo.com/itprato
 * @author    DedeCMS团队
 * @copyright Copyright (c) 2007 - 2021, 上海卓卓网络科技有限公司 (DesDev, Inc.)
 * @license   http://help.dedecms.com/usersguide/license.html
 * @link      http://www.dedecms.com
 */
require_once DEDEINC . '/channelunit.class.php';
require_once DEDEINC . '/typelink.class.php';
require_once DEDEINC . '/ftp.class.php';

/**
 * 视图类
 *
 * @package    PartView
 * @subpackage DedeCMS.Libraries
 * @link       http://www.dedecms.com
 */
class PartView
{
    public $dsql;
    public $dtp;
    public $TypeID;
    public $Fields;
    public $TypeLink;
    public $pvCopy;
    public $refObj;
    public $ftp;
    public $remoteDir;

    /**
     *  php5构造函数
     *
     * @access public
     * @param  int $typeid       栏目ID
     * @param  int $needtypelink 是否需要栏目连接
     * @return void
     */
    public function __construct($typeid = 0, $needtypelink = true)
    {
        global $_sys_globals, $ftp;
        $this->TypeID = $typeid;
        $this->dsql = $GLOBALS['dsql'];
        $this->dtp = new DedeTagParse();
        $this->dtp->SetNameSpace("dede", "{", "}");
        $this->dtp->SetRefObj($this);
        $this->ftp = &$ftp;
        $this->remoteDir = '';

        if ($needtypelink) {
            $this->TypeLink = new TypeLink($typeid);
            if (is_array($this->TypeLink->TypeInfos)) {
                foreach ($this->TypeLink->TypeInfos as $k => $v) {
                    if (preg_match("/[^0-9]/", $k)) {
                        $this->Fields[$k] = $v;
                    }
                }
            }
            $_sys_globals['curfile'] = 'partview';
            $_sys_globals['typename'] = $this->Fields['typename'];

            //设置环境变量
            SetSysEnv($this->TypeID, $this->Fields['typename'], 0, '', 'partview');
        }
        SetSysEnv($this->TypeID, '', 0, '', 'partview');
        $this->Fields['typeid'] = $this->TypeID;

        //设置一些全局参数的值
        foreach ($GLOBALS['PubFields'] as $k => $v) {
            $this->Fields[$k] = $v;
        }
    }

    //php4构造函数
    public function PartView($typeid = 0, $needtypelink = true)
    {
        $this->__construct($typeid, $needtypelink);
    }

    /**
     *  重新指定引入的对象
     *
     * @access private
     * @param  object $refObj 引用对象
     * @return void
     */
    public function SetRefObj(&$refObj)
    {
        $this->dtp->SetRefObj($refObj);
        if (isset($refObj->TypeID)) {
            $this->__construct($refObj->TypeID);
        }
    }

    /**
     *  指定typelink对象给当前类实例
     *
     * @access public
     * @param  string $typelink 栏目链接
     * @return string
     */
    public function SetTypeLink(&$typelink)
    {
        $this->TypeLink = $typelink;
        if (is_array($this->TypeLink->TypeInfos)) {
            foreach ($this->TypeLink->TypeInfos as $k => $v) {
                if (preg_match("/[^0-9]/", $k)) {
                    $this->Fields[$k] = $v;
                }
            }
        }
    }

    /**
     *  设置要解析的模板
     *
     * @access public
     * @param  string $temp  模板
     * @param  string $stype 设置类型
     * @return string
     */
    public function SetTemplet($temp, $stype = "file")
    {
        if ($stype == "string") {
            $this->dtp->LoadSource($temp);
        } else {
            $this->dtp->LoadTemplet($temp);
        }
        if ($this->TypeID > 0) {
            $this->Fields['position'] = $this->TypeLink->GetPositionLink(true);
            $this->Fields['title'] = $this->TypeLink->GetPositionLink(false);
        }
        $this->ParseTemplet();
    }

    /**
     *  显示内容
     *
     * @access public
     * @return void
     */
    public function Display()
    {
        $this->dtp->Display();
    }

    /**
     *  获取内容
     *
     * @access public
     * @return string
     */
    public function GetResult()
    {
        return $this->dtp->GetResult();
    }

    /**
     *  保存结果为文件
     *
     * @access public
     * @param  string $filename 文件名
     * @param  string $isremote 是否远程
     * @return string
     */
    public function SaveToHtml($filename, $isremote = 0)
    {
        global $cfg_remote_site;
        //如果启用远程发布则需要进行判断
        if ($cfg_remote_site == 'Y' && $isremote == 1) {
            //分析远程文件路径
            $remotefile = str_replace(DEDEROOT, '', $filename);
            $localfile = '..' . $remotefile;
            //创建远程文件夹
            $remotedir = preg_replace('/[^\/]*\.js/', '', $remotefile);
            $this->ftp->rmkdir($remotedir);
            $this->ftp->upload($localfile, $remotefile, 'ascii');
        }
        $this->dtp->SaveTo($filename);
    }

    /**
     *  解析模板里的标签
     *
     * @access private
     * @return void
     */
    public function ParseTemplet()
    {
        $GLOBALS['envs']['typeid'] = $this->TypeID;
        if ($this->TypeID > 0) {
            $GLOBALS['envs']['topid'] = GetTopid($this->TypeID);
        } else {
            $GLOBALS['envs']['topid'] = 0;
        }
        if (isset($this->TypeLink->TypeInfos['reid'])) {
            $GLOBALS['envs']['reid'] = $this->TypeLink->TypeInfos['reid'];
        }
        if (isset($this->TypeLink->TypeInfos['channeltype'])) {
            $GLOBALS['envs']['channelid'] = $this->TypeLink->TypeInfos['channeltype'];
        }
        MakeOneTag($this->dtp, $this); //这个函数放在 channelunit.func.php 文件中
    }

    /**
     * 获得限定模型或栏目的一个指定文档列表
     * 这个标记由于使用了缓存，并且处理数据是支持分表模式的，因此速度更快，但不能进行整站的数据调用
     *
     * @param  string $templets
     * @param  int    $typeid
     * @param  int    $row
     * @param  int    $col
     * @param  int    $titlelen
     * @param  int    $infolen
     * @param  int    $imgwidth
     * @param  int    $imgheight
     * @param  string $listtype
     * @param  string $orderby
     * @param  string $keyword
     * @param  string $innertext
     * @param  int    $tablewidth
     * @param  int    $arcid
     * @param  string $idlist
     * @param  int    $channelid
     * @param  string $limit
     * @param  int    $att
     * @param  string $order
     * @param  int    $subday
     * @param  int    $autopartid
     * @param  int    $ismember
     * @param  string $maintable
     * @param  object $ctag
     * @return array
     */
    public function GetArcList($templets = '', $typeid = 0, $row = 10, $col = 1, $titlelen = 30, $infolen = 160,
        $imgwidth = 120, $imgheight = 90, $listtype = "all", $orderby = "default", $keyword = "", $innertext = "",
        $tablewidth = "100", $arcid = 0, $idlist = "", $channelid = 0, $limit = "", $att = 0, $order = 'desc', $subday = 0,
        $autopartid = -1, $ismember = 0, $maintable = '', $ctag = ''
    ) {
        if (empty($autopartid)) {
            $autopartid = -1;
        }
        if (empty($typeid)) {
            $typeid = $this->TypeID;
        }
        if ($autopartid != -1) {
            $typeid = $this->GetAutoChannelID($autopartid, $typeid);
            if ($typeid == 0) {
                return "";
            }
        }

        if (!isset($GLOBALS['__SpGetArcList'])) {
            include_once dirname(__FILE__) . "/inc/inc_fun_SpGetArcList.php";
        }
        return SpGetArcList(
            $this->dsql, $templets, $typeid, $row, $col, $titlelen, $infolen, $imgwidth, $imgheight,
            $listtype, $orderby, $keyword, $innertext, $tablewidth, $arcid, $idlist, $channelid, $limit, $att,
            $order, $subday, $ismember, $maintable, $ctag
        );
    }

    //关闭所占用的资源
    public function Close()
    {
    }
} //End Class
